# 可迭代协议 统一的循环方式
# 迭代器
# dir()函数:查看变量执行方式
# print(dir(str))  # __iter__
# print(dir(list))  # 也有__iter__
# print(dir(dict))  # 也有__iter__
# print("__iter__" in dir(int))  # False
# print("__iter__" in dir(bool))  # False

# iterable 可迭代的
# 所有的可迭代对象内部都含有一个__iter__的功能
# lst = ["你好", "您不好", "您很好"]
# it = lst.__iter__()
# print(it)  # <list_iterator object at 0x000002C1BC55A110>

# __next__()下一个
# print(dir(it))
# print(it.__next__())
# print(it.__next__())
# print(it.__next__())
# 这里会报错 停止迭代
# print(it.__next__())  # StopIteration


"""
使用步骤:
    1.同过__iter__拿到可迭代对象中的迭代器
    2.用迭代器执行__next__拿到元素
    3.重复第二步,反复执行.直到最后出现了StopIteration结束
"""
s = {"你好", "哒哒哒哒", "哈哈哈"}
# it = s.__iter__()
# print(it.__next__())
# print(it.__next__())
# print(it.__next__())
"""
坑:
    1.想让迭代器重头拿数据 需要重新拿到迭代器
    2.这里不适合使用数学上的等价代换
"""
# 还可以使用iter()来获取迭代器
it = iter(s)  # iter = __iter__
print(next(it))  # next = __next__
print(next(it))
print(next(it))
# 列表不是迭代器 迭代器本身是一个可迭代对象 迭代器可以使用for循环